package com.sky.config;


import com.sky.interceptor.JwtTokenAdminInterceptor;
import com.sky.json.JacksonObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

import java.util.List;

/**
 * 配置类，注册web层相关组件
 */
@Configuration
@Slf4j
public class WebMvcConfiguration extends WebMvcConfigurationSupport {

@Autowired
private JwtTokenAdminInterceptor jwtTokenAdminInterceptor;


/**
 * 注册自定义拦截器
 *
 * @param registry
 */
@Override
protected void addInterceptors(InterceptorRegistry registry) {
    log.info("开始注册自定义拦截器...");
    //  配置后台服务端
    registry.addInterceptor(jwtTokenAdminInterceptor)
            .addPathPatterns("/admin/**")
            .excludePathPatterns("/admin/employee/login")
            .excludePathPatterns("/admin/order/completeByNumber")// 骑手运单完成，同步更新订单完成
            .excludePathPatterns("/admin/order/reminderNewOrders")// 新订单通知接口
            .excludePathPatterns("/admin/order/reminder")// 用户催单通知接口
            .excludePathPatterns("/admin/merchant/getShopById")// 查询商铺对象接口
            .excludePathPatterns("/admin/order/changeOrderStatus")// 更改订单状态
            .excludePathPatterns("/admin/order/getAddressByOrderNumber");  // 通过订单号查询订单信息

    //  配置小程序用户端


}
// /**
//  * 设置静态资源映射
//  * @param registry
//  */
// @Override
// protected void addResourceHandlers(ResourceHandlerRegistry registry) {
//
//     registry.addResourceHandler("/doc.html").
//             addResourceLocations("classpath:/META-INF/resources/");
//
//     registry.addResourceHandler("/**").
//             addResourceLocations("classpath:/static/");
//
//     registry.addResourceHandler("/webjars/**").
//             addResourceLocations("classpath:/META-INF/resources/webjars/");
// }

/**
 * 设置静态资源映射
 *
 * @param registry
 */
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
    //  swagger配置可访问
    registry.addResourceHandler("/doc.html").
            addResourceLocations("classpath:/META-INF/resources/");
    // cpolar 映射可访问资源
    registry.addResourceHandler("/webjars/**").
            addResourceLocations("classpath:/META-INF/resources/webjars/");
}

/**
 * 通过knife4j生成接口文档
 *
 * @return
 */
@Bean
public Docket docket() {
    ApiInfo apiInfo = new ApiInfoBuilder()
            .title("苍穹外卖项目接口文档")
            .version("3.0")
            .description("苍穹外卖项目接口文档")
            .build();
    Docket docket = new Docket(DocumentationType.SWAGGER_2)
            .apiInfo(apiInfo)
            .select()
            .apis(RequestHandlerSelectors.basePackage("com.sky.controller"))
            .paths(PathSelectors.any())
            .build();
    return docket;
}
/**
 * 扩展Spring MVC框架的消息转化器
 * @param converters
 */
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    log.info("扩展消息转换器...");
    //创建一个消息转换器对象
    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    //需要为消息转换器设置一个对象转换器，对象转换器可以将Java对象序列化为json数据
    converter.setObjectMapper(new JacksonObjectMapper());
    //将自己的消息转化器加入容器中
    converters.add(0, converter);
}
}
